package jmine.tec.script;

/**
 * Contrato que dispatchers de Script devem respeitar.
 * 
 * @author jrenaut
 */
public interface ScriptDispatcher {

    /**
     * Envia uma solicitação de execução de script
     * 
     * @param <R> O tipo do resultado
     * @param context O contexto de execução do script
     * @return R
     * @throws ScriptExecutorException Se ocorrer um erro no dispatch do contexto de execução
     */
    <R> R dispatchExecution(ScriptExecutionContext<R> context) throws ScriptExecutorException;

    /**
     * Envia uma solicitação de dependências de script
     * 
     * @param <R> O tipo do resultado
     * @param context O contexto de execução do script
     * @return R
     * @throws ScriptExecutorException Se ocorrer um erro no dispatch do contexto de execução
     */
    <R> R dispatchGetDependencies(ScriptExecutionContext<R> context) throws ScriptExecutorException;

    /**
     * Envia uma solicitação de validação para o script
     * 
     * @param <R> O tipo do resultado
     * @param context O contexto de execução do script
     * @return R
     * @throws ScriptExecutorException Se ocorrer um erro no dispatch do contexto de execução
     */
    <R> R dispatchGetValidations(ScriptExecutionContext<R> context) throws ScriptExecutorException;

    /**
     * Registra ScriptExecutor's para uso neste Dispatcher.
     * 
     * @param executors ScriptExecutor[]
     */
    void setScriptExecutors(ScriptExecutor... executors);

}
